import os

import pandas as pd

from script_executor.Domain import Domain, InputItem


class ExcelMerger(Domain):
    def __init__(self):
        self.source_folder = ""
        self.output_path = ""

    def get_input_items(self) -> list[InputItem]:
        return [
            InputItem(
                label="Excel文件所在文件夹",
                input_name="source_folder",
                input_type="folder",
                default_value="",
                placeholder_text="请选择包含Excel文件的文件夹",
                options=[],
                required=True
            ),
            InputItem(
                label="合并后输出文件路径",
                input_name="output_path",
                input_type="folder",
                default_value="",
                placeholder_text="请输入合并后的Excel文件保存路径",
                options=[],
                required=True
            )
        ]

    def _get_all_excel_files(self) -> list[str]:
        """获取文件夹中所有Excel文件"""
        excel_extensions = ('.xlsx', '.xls', '.xlsm')
        excel_files = []

        for file in os.listdir(self.source_folder):
            if file.lower().endswith(excel_extensions):
                excel_files.append(os.path.join(self.source_folder, file))

        return excel_files

    def execute(self) -> str:
        try:
            # 验证输入
            if not self.source_folder or not os.path.isdir(self.source_folder):
                return "错误：请选择有效的源文件夹"

            if not self.output_path:
                return "错误：请输入有效的输出文件路径"

            output_file = os.path.join(self.output_path, '合并后的文件.xlsx')

            # 获取所有Excel文件
            excel_files = self._get_all_excel_files()
            if not excel_files:
                return "错误：在指定文件夹中未找到任何Excel文件"

            # 用于存储所有数据
            all_data = []
            total_sheets = 0

            # 遍历所有Excel文件
            for file in excel_files:
                try:
                    # 读取所有工作表
                    xls = pd.ExcelFile(file)

                    # 遍历每个工作表
                    for sheet_name in xls.sheet_names:
                        df = pd.read_excel(xls, sheet_name)
                        # 添加来源信息，方便追溯
                        df['source_file'] = os.path.basename(file)
                        df['source_sheet'] = sheet_name
                        all_data.append(df)
                        total_sheets += 1

                except Exception as e:
                    return f"处理文件 {os.path.basename(file)} 时出错：{str(e)}"

            # 合并所有数据
            if not all_data:
                return "错误：未从Excel文件中读取到任何数据"

            merged_df = pd.concat(all_data, ignore_index=True)

            # 保存合并后的数据
            merged_df.to_excel(output_file, index=False)

            return (f"合并成功！\n"
                    f"共处理 {len(excel_files)} 个Excel文件，"
                    f"包含 {total_sheets} 个工作表，\n"
                    f"合并后的数据已保存至：{output_file}")

        except Exception as e:
            return f"执行过程中发生错误：{str(e)}"